package cn.tedu.controller;

import cn.tedu.pojo.dto.User;
import cn.tedu.pojo.vo.JsonResult;
import cn.tedu.util.JWTUtil;
import cn.tedu.util.PasswordEncoderUtil;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author Kiven
 */
@RequestMapping("/admin/user")
@RestController
//@CrossOrigin
public class UserController {



    @PostMapping
    public JsonResult loginByFace(){
        return JsonResult.success();
    }

    @PostMapping("/loginByUsernameAndPassword")
    public JsonResult loginByUserNameAndPassword(@RequestBody User user,
                                                 HttpServletRequest request,
                                                 HttpServletResponse response,
                                                 HttpSession session){

        System.out.println(user.getUsername()+user.getPassword());

        // 根据用户名去到数据库拿密码 TODO
        // MD5 123456 + "sdfsdf"  ASDFHASJHWEKJDKSJAL
        //     1234567 + "sdfsdf"  ASDFHASJHWEKJDKSJALDAS
        //  穷举 1235447  123855 12774
        //  123456 + "sadfasf"  ASDFHASJHWEKJDKSJAL  for 100次
        // ByCryte 你第一次登录 花1s ，第二次登录，2s 时间成本太高，穷举不了所有可能性
        // sigPwd模拟从数据库拿出来的密码，改密码在注册时加密放入，数据库存储的是密文例：$2a$10$B4WcenV2GOOpIPVG/sQSWuZ04llGaDdQSOvzXfJtpMYOKZHpJNLx.

        // 结构解释了解即可：$2a$：这部分是算法的版本标识。 10$：这是成本（或难度）参数，表示加密的计算复杂度。
        // B4WcenV2GOOpIPVG/sQSWu：这是盐值。在您的例子中，盐值是B4WcenV2GOOpIPVG/sQSWu。
        // Z04llGaDdQSOvzXfJtpMYOKZHpJNLx.：这是实际的散列值，即原始密码加上盐值经过BCrypt算法处理后的结果。

        //模拟注册
        String sigPwd =PasswordEncoderUtil.enc(user.getPassword());

        // "123456" 是前端传回来的密码 模拟登录 sigPwd 从数据库拿出来  登录
        boolean matches = PasswordEncoderUtil.decrypt("123456", sigPwd);

        if(matches){
            // 准备jwt的数据
            Map<String,Object> map = new HashMap<>();
            map.put("username",user.getUsername());
            // 生产token并返回
            return JsonResult.success( JWTUtil.getToken(map));
        }

        return JsonResult.failed("用户名或密码错误");

    }




    /**
     * 根据手机号码验证码实现
     * @param request
     * @param response
     * @return
     */
    @GetMapping("/loginByPhoneAndCode")
    public JsonResult loginByPhoneAndCode(String phone, String code,
                                                 HttpServletRequest request, HttpServletResponse response){
        // 验证码存redis
        // 校验验证码和用户信息 byPhone
        Map<String,Object> map = new HashMap<>();
        map.put("username",phone);
        return JsonResult.success( JWTUtil.getToken(map));
    }

}
